package cn.uin.domain.shared.adapter.repository;

/**
 * @ClassName Pageable
 * @Description:分页请求接口
 * @Author: Administrator
 * @CreateDate: 2025/11/14 16:53
 * @Version: 1.0
 */
public interface IPageable {

	/**
	 * 获取当前页码（从0开始）
	 * @return 当前页码
	 */
	int getPageNumber();

	/**
	 * 获取每页大小
	 * @return 每页记录数
	 */
	int getPageSize();

	/**
	 * 获取偏移量
	 * @return 跳过的记录数
	 */
	long getOffset();

	/**
	 * 获取排序信息
	 * @return 排序对象
	 */
	ISort getSort();

	/**
	 * 获取下一页的分页信息
	 * @return 下一页的Pageable对象
	 */
	IPageable next();

	/**
	 * 获取上一页或第一页的分页信息
	 * @return 上一页或第一页的Pageable对象
	 */
	IPageable previousOrFirst();

	/**
	 * 获取第一页的分页信息
	 * @return 第一页的Pageable对象
	 */
	IPageable first();

	/**
	 * 检查是否存在上一页
	 * @return 如果存在上一页返回true，否则返回false
	 */
	boolean hasPrevious();

	/**
	 * 检查是否启用分页
	 * @return 如果启用分页返回true，否则返回false
	 */
	boolean isPaged();

	// ========== 静态工厂方法 ==========

	/**
	 * 创建不分页的Pageable对象
	 * @return 不分页的Pageable对象
	 */
	static IPageable unpaged() {
		return UnPaged.INSTANCE;
	}

	/**
	 * 创建指定页码和页大小的Pageable对象（无排序）
	 * @param page 页码（从0开始）
	 * @param size 页大小
	 * @return Pageable对象
	 */
	static IPageable of(int page, int size) {
		return new SimplePageRequest(page, size, ISort.unsorted());
	}

	/**
	 * 创建指定页码、页大小和排序的Pageable对象
	 * @param page 页码（从0开始）
	 * @param size 页大小
	 * @param ISort 排序对象
	 * @return Pageable对象
	 */
	static IPageable of(int page, int size, ISort ISort) {
		return new SimplePageRequest(page, size, ISort);
	}

}
